import { ValidateRuleItem } from '@/types/utils/validate';
import {
  IPublicTypeCompositeValue,
  IPublicTypeJSExpression,
  IPublicTypeJSFunction,
  IPublicTypeJSONObject,
} from '@alilc/lowcode-types';

/**
 * 动作调用用例
 */
export interface IActionCase {
  /**
   * From Action.name
   */
  name?: string;

  /**
   * 用例名称
   */
  desc: string;

  /**
   * 代码片段
   */
  code?: string;

  /**
   * 表单参数
   */
  form?: IPublicTypeCompositeValue;

  __uuid?: string;
}

export class ITypeEntity {
  _id?: any;
  /** 类型版本号 */
  version?: number;
  /** 类型哈希值 */
  hash?: string;
  /* 文件路径 */
  path?: string;
  size?: number;
  /* 类型名称（英文） */
  name: string;
  desc: string;
  /**
   * 介绍
   */
  intro?: string;
  tags?: string[];
  /**
   * 类型用途
   * constants 全局常量
   * props 组件参数
   * query 页面参数
   * db 数据库建模
   * dto 接口参数
   * data 页面数据
   * vo 展示型数据
   * config 存储页面/组件参数包含props、query、params等等
   * cloud_function 云函数
   * -- 页面/组件内部Data
   */
  type:
    | 'constants'
    | 'props'
    | 'db'
    | 'dto'
    | 'data'
    | 'action'
    | 'vo'
    | 'query'
    | 'api'
    | 'api-import'
    | 'folder'
    | 'config'
    | 'scene'
    | 'cloud-app'
    | 'code'
    | 'cloud_function'
    | 'draw'
    | 'flow'
    | 'typescript'
    | 'javascript'
    | 'text'
    | 'sql'
    | 'json';
  /**
   * 关联对象ID
   * use(上级文件夹ID--取消使用)
   */
  fkId?: string;
  /**
   * 关联文件名
   */
  fileName?: string;

  /**
   * 链接路径
   */
  linkPath?: string;

  /**
   * 代码文件语言
   */
  language?: string;

  /**
   * 上级文件夹名称
   */
  folder?: string;
  /**
   * 文件夹路径
   */
  folderPath?: string;

  /**
   * 路由（如果存在则其内文件自动添加前缀）
   */
  routePath?: string;

  /**
   * 路由菜单名称
   */
  routeMenuName?: string;

  /**
   * 不被父级布局嵌套
   */
  noLayout?: boolean;

  /**
   * 项目ID
   */
  projectId?: string;

  /**
   * 数据
   */
  data?: IPublicTypeJSONObject;

  /**
   * 数据字段
   * 1.仅作类型用于描述一个对象的模型
   * 2.用作API时，表达此接口返回值的类型
   * 3.用作Action时，用来描述一个函数的返回值
   */
  fields?: ITypeEntityField[];

  /**
   * API 编辑
   */
  uri?: string;
  method?: string;
  timeout?: number;
  headers?: ITypeEntityField[];
  /**
   * 参数
   * 1.用于API，表达此接口可接收的参数
   * 2.用于Action，表达此函数可接收的参数
   */
  params?: ITypeEntityField[];
  query?: ITypeEntityField[];
  pathParams?: ITypeEntityField[];
  isCors?: boolean;
  contentType?: string;
  /**
   * 测试用例集合
   */
  cases?: ITypeApiCase[] | string;

  /**
   * Action 使用配置
   */
  lifeCycle?:
    | 'componentDidMount'
    | 'componentWillUnmount'
    | 'onShow'
    | 'onHide'
    | 'onLaunch'
    | 'componentDidCatch';
  code?: IPublicTypeJSFunction;
  /**
   * 源码
   */
  source?: string;

  /**
   * Api import 使用配置
   */
  apiDocUrl?: string;
  apiDocStr?: string;
  host?: string;
  /**
   * 域名映射全局变量名称
   */
  hostConstantName?: string;
  basePath?: string;

  /**
   * 去重字符
   */
  unikey?: string;

  extends?: Record<string, any> & {
    actionCases?: IActionCase[];
    clientTags?: string[];
  };

  from?: {
    projectId?: string;
    sceneId?: string;
    typeId?: string;
  };

  userId?: number;
  teamId?: number;
  create_time?: number;
  update_time?: number;

  /**
   * 本地映射路径
   */
  localPath?: string;

  /**
   * 字段变更(用于传递时判断是否执行后续操作)
   */
  __changeFields?: string[];

  // migrations?: {
  //   version: number;
  //   up: string; // 升级脚本
  //   down: string; // 回滚脚本
  // }[];

  /**
   * 数据库表配置
   */
  db?: {
    // 数据库类型
    type?: 'postgres' | 'mysql' | 'mongodb';
    // 表名
    name?: string;
    // 数据库名
    database?: string;
    // 表注释
    comment?: string;
    // 表引擎（MySQL）
    engine?: string;
    // 字符集
    charset?: string;
    // 排序规则
    collation?: string;
    // 是否同步到数据库
    synchronize?: boolean;
    // 是否自动生成主键
    autoIncrement?: boolean;
    // 主键类型
    primaryKeyType?: 'uuid' | 'increment' | 'rowid';
    // 主键名称
    primaryKeyName?: string;
    // 是否使用软删除
    softDelete?: boolean;
    // 软删除字段名
    softDeleteColumn?: string;
    // 是否使用时间戳
    timestamps?: boolean;
    // 创建时间字段名
    createdAtColumn?: string;
    // 更新时间字段名
    updatedAtColumn?: string;
    // 是否使用版本控制
    versioning?: boolean;
    // 版本字段名
    versionColumn?: string;
  };

  // 数据访问控制配置
  access?: {
    // 是否启用访问控制
    enabled?: boolean;

    // 数据操作拦截器配置
    interceptors?: {
      // 查询拦截
      select?: {
        // 是否启用
        enabled?: boolean;
        // 拦截器名称
        name?: string;
        // 自定义条件
        condition?: string;
        // 错误提示
        message?: string;
      };

      // 插入拦截
      insert?: {
        enabled?: boolean;
        name?: string;
        condition?: string;
        message?: string;
      };

      // 更新拦截
      update?: {
        enabled?: boolean;
        name?: string;
        condition?: string;
        message?: string;
      };

      // 删除拦截
      delete?: {
        enabled?: boolean;
        name?: string;
        condition?: string;
        message?: string;
      };
    };

    // 数据验证规则
    validations?: {
      // 字段级验证
      fields?: {
        [fieldName: string]: {
          // 验证规则
          rules?: {
            type: 'required' | 'unique' | 'pattern' | 'range' | 'custom';
            value?: any;
            message?: string;
          }[];
          // 自定义验证函数
          validator?: string;
        };
      };

      // 实体级验证
      entity?: {
        // 验证规则
        rules?: {
          type: 'unique' | 'custom';
          fields?: string[];
          value?: any;
          message?: string;
        }[];
        // 自定义验证函数
        validator?: string;
      };
    };

    // 数据转换器
    transformers?: {
      // 写入前转换
      beforeWrite?: {
        enabled?: boolean;
        transformer?: string;
      };
      // 读取后转换
      afterRead?: {
        enabled?: boolean;
        transformer?: string;
      };
    };
  };
}

export class ITypeEntityField {
  /* 字段名 */
  name?: string;
  /* 描述 */
  desc?: string;
  /* 数据类型 */
  type?: 'string' | 'number' | 'object' | 'boolean' | 'Date' | 'function';
  /**
   * 函数签名（当 type 为 'function' 时使用）
   */
  functionSignature?: string;
  isApi?: boolean;
  isArray?: boolean;
  required?: boolean;
  /**
   * 枚举
   */
  enums?: ITypeEntityFieldEnum[];
  /**
   * 子对象
   */
  fields?: ITypeEntityField[];
  /**
   * 标记是否自动生成
   * 用于标记字段是否由系统自动生成，如果为true，则表示字段由系统自动生成，否则表示字段由用户编辑
   */
  autoGenerated?: boolean;
  additionalProperties?: {
    type: ITypeEntityField['type'];
  };
  /**
   * 引用其他类型名称
   */
  import?: string;
  importEntity?: ITypeEntity;

  /**
   * Api 使用配置
   */
  apiImport?: string;
  apiImportEntity?: ITypeEntity;
  apiOptions?: ITypeApiOptions;
  apiCases?: ITypeApiCase[];
  apiExamples?: Record<
    string,
    {
      summary: string;
      value: string | Record<string, any>;
    }
  >;
  isInit?: boolean;
  isSync?: boolean;

  /**
   * 默认值JSON
   */
  default?: string;
  property?: unknown;
  example?: string | Record<string, any>;

  /**
   * 表单配置
   */
  setter?: string;
  setterProps?: Record<string, any>;
  rules?: any[];
  /**
   * 提示文字
   */
  tip?: string;

  /**
   * 备注文档
   */
  md?: string;

  __uuid?: string;
  id?: string;

  relation?: {
    type: 'one-to-one' | 'one-to-many' | 'many-to-many';
    target: string; // 关联的目标表
    foreignKey: string; // 外键字段
  };

  // constraints?: {
  //   check?: string; // 检查约束
  //   default?: any; // 默认值
  //   references?: {  // 外键引用
  //     table: string;
  //     column: string;
  //   };
  // };

  // indexes?: {
  //   type: 'btree' | 'hash' | 'gist' | 'gin';
  //   unique?: boolean;
  //   name?: string;
  // }[];

  /**
   * 数据库字段配置
   */
  db?: {
    type?:
      | 'bigint'
      | 'boolean'
      | 'varchar'
      | 'char'
      | 'text'
      | 'int'
      | 'float'
      | 'double'
      | 'decimal'
      | 'date'
      | 'datetime'
      | 'timestamp'
      | 'json'
      | 'jsonb'
      | 'array'
      | 'simple-array'
      | 'uuid';
    length?: number;
    precision?: number;
    scale?: number;
    nullable?: boolean;
    default?: any;
    comment?: string;
    unique?: boolean;
    isPrimary?: boolean;
    isGenerated?: boolean;
    isVersion?: boolean;
    // 索引相关配置
    indexFields?: string[]; // 复合索引字段列表
    indexName?: string; // 索引名称
    fulltext?: boolean;
    parser?: string;
    spatial?: boolean;
    concurrent?: boolean;
    sparse?: boolean;
    background?: boolean;
    expireAfterSeconds?: number;
    where?: string;
    nullFiltered?: boolean;
    // 外键配置
    foreignKey?: {
      table: string;
      column: string;
      onDelete?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION';
      onUpdate?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION';
    };
  };
}

export class ITypeEntityFieldEnum {
  label: string;
  value: string | number;
  type: 'string' | 'number';
  color?: string;
}

export class ITypeApiCase {
  id: string;
  name: string;
  desc?: string;
  options: ITypeApiOptions;
  result: IPublicTypeJSONObject;
  user_id: number;

  /**
   * 生成
   */
  fileName?: string;
  fieldName?: string;
  fieldDesc?: string;

  createAt: number;
}

export class ITypeApiOptions {
  host?: string;
  basePath?: string;
  contentType?: string;
  uri: string | IPublicTypeJSExpression;
  method?: string | IPublicTypeJSExpression;
  timeout?: number;
  isCors?: boolean;
  debugState?: Record<string, any>;
  params?: IPublicTypeCompositeValue;
  headers?: IPublicTypeCompositeValue;
  query?: IPublicTypeCompositeValue;
  pathParams?: IPublicTypeCompositeValue;
  fit?: string;
  requestHandler?: IPublicTypeJSFunction;
  dataHandler?: IPublicTypeJSFunction;
  errorHandler?: IPublicTypeJSFunction;
  willFetch?: IPublicTypeJSFunction;
  shouldFetch?: IPublicTypeJSFunction;
}
